package com.wangcanxuan.www.dao;

import java.lang.reflect.InvocationTargetException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * sql港口
 *
 * @author HHLJ
 * @date 2022/03/25
 */
public interface SqlSession {

    

    /**
     * 获取主键
     *
     * @param obj 传入对象
     * @return String
     * @throws NoSuchMethodException     没有这样的方法异常
     * @throws InvocationTargetException 调用目标异常
     * @throws IllegalAccessException    非法访问异常
     */
    String getPrimaryKey(Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException;

    /**
     * 向数据库插入数据
     *
     * @param obj 传入对象
     * @return int
     * @throws SQLException sqlexception异常
     */
    int insert(Object obj) throws Exception;

    /**
     * 在数据库中删除数据
     *
     * @param obj 传入对象
     * @return int
     * @throws SQLException sqlexception异常
     */
    int delete(Object obj) throws Exception;

    /**
     * 通过主键id更新数据库内容
     *
     * @param obj 传入对象
     * @return int
     * @throws SQLException              sqlexception异常
     * @throws InvocationTargetException 调用目标异常
     * @throws NoSuchMethodException     没有这样的字段异常
     * @throws IllegalAccessException    非法访问异常
     */
    int updateById(Object obj) throws Exception;

    /**
     * 通过map集合，对数据库对应字段进行更新
     *
     * @param obj 传入对象
     * @param map 参数map集合
     * @return int
     * @throws InvocationTargetException 调用目标异常
     * @throws NoSuchMethodException     没有这样的方法异常
     * @throws IllegalAccessException    非法访问异常
     * @throws SQLException              sqlexception异常
     */
    int updateByMap(Object obj, Map<String, Object> map) throws Exception;

    /**
     * 向数据库查询一个集合
     *
     * @param sql    sql
     * @param params 参数数组
     * @param obj    传入对象
     * @param clazz  clazz
     * @return {@link List}<{@link ?}>
     * @throws SQLException              sqlexception异常
     * @throws NoSuchFieldException      没有这样的字段异常
     * @throws InvocationTargetException 调用目标异常
     * @throws IllegalAccessException    非法访问异常
     * @throws InstantiationException    实例化异常
     */
    List<?> selectList(String sql, Object[] params, Object obj, Class<?> clazz) throws Exception;

    /**
     * 向数据库查询一个实体对象
     *
     * @param sql    sql
     * @param params 参数
     * @param obj    传入对象
     * @param clazz  传入对象的类
     * @return {@link Object}
     * @throws SQLException              sqlexception异常
     * @throws NoSuchFieldException      没有这样的磁场异常
     * @throws InvocationTargetException 调用目标异常
     * @throws IllegalAccessException    非法访问异常
     * @throws InstantiationException    实例化异常
     */
    Object selectObject(String sql, Object[] params, Object obj, Class<?> clazz) throws Exception;

    /**
     * 向数据库查询一个字段
     *
     * @param sql    sql
     * @param params 参数个数
     * @param obj    传入对象
     * @return {@link Object}
     * @throws SQLException sqlexception异常
     */
    Object selectField(String sql, Object[] params, Object obj) throws Exception;

    /**
     * 得到SELECT的sql语句
     *
     * @param obj 传入对象
     * @return {@link String}
     */
    String getSelectSql(Object obj) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException;

    /**
     * 设置占位符的通用方法，数组设置参数
     *
     * @param preparedStatement 事先准备好的声明
     * @param params            参数数组
     * @throws SQLException sqlexception异常
     */
    void setParams(PreparedStatement preparedStatement, Object[] params) throws SQLException;

    /**
     * 设置占位符的通用方法，由该对象设置参数
     *
     * @param preparedStatement 事先准备好的声明
     * @param obj               传入对象
     * @throws SQLException sqlexception异常
     */
    void setParams(PreparedStatement preparedStatement, Object obj) throws SQLException, InvocationTargetException, NoSuchMethodException, IllegalAccessException;

    /**
     * 执行更新
     *
     * @param sql    sql
     * @param params 参数数组
     * @param obj    传入对象
     * @return int
     * @throws SQLException sqlexception异常
     */
    int executeUpdate(String sql, Object[] params, Object obj) throws Exception;


}
